library(dplyr)
library(readr)
histologies_df <- read_tsv("../../data/pbta-histologies.tsv")
Parsed with column specification:
cols(
  .default = col_character(),
  OS_days = col_double(),
  age_last_update_days = col_double(),
  normal_fraction = col_double(),
  tumor_fraction = col_double(),
  tumor_ploidy = col_double()
)
See spec(...) for full column specifications.
chordoma_samples <- histologies_df %>%
  filter(short_histology=="Chordoma") %>% 
  pull(Kids_First_Biospecimen_ID)
focal_cn_df <- read_tsv("../focal-cn-file-preparation/results/controlfreec_annotated_cn_autosomes.tsv.gz")
Parsed with column specification:
cols(
  biospecimen_id = col_character(),
  status = col_character(),
  copy_number = col_double(),
  ploidy = col_double(),
  ensembl = col_character(),
  gene_symbol = col_character(),
  cytoband = col_character()
)
chordoma_loss <- focal_cn_df %>% 
  filter(biospecimen_id %in% chordoma_samples, gene_symbol=="SMARCB1")

chordoma_loss 
#we need to include the sample_id field from pbta-histologies.tsv in the final table (field will allow #us to map between RNA-seq (e.g., SMARCB1 expression values) and WGS data (e.g., SMARCB1 focal copy #number status) from the same event for a given individual).
#To get the SMARCB1 jitter plot in the photo here #250 (comment), you will first need to read in the #collapsed expression data

expression_data <- read_rds(file.path("..", "..", "data", "pbta-gene-expression-rsem-fpkm-collapsed.stranded.rds"))
expression_data
chordoma_id_df <- histologies_df %>% 
  # only rows with chordoma samples
  filter(short_histology == "Chordoma") %>%
  # select only these columns that we'll need later
  select(Kids_First_Biospecimen_ID, sample_id, Kids_First_Participant_ID,
         experimental_strategy)
chordoma_id_df
copy_neutral_df <- chordoma_id_df %>% 
  # the copy events can only be taken from WGS data not RNA-seq data
  # we also only want biospecimens where a loss was not recorded to avoid duplicates
  filter(experimental_strategy == "WGS",
         !(Kids_First_Biospecimen_ID %in% chordoma_loss$biospecimen_id)) %>%
  # if there's no loss, let's assume status is copy neutral
  mutate(status = "neutral") %>%
  # let's get the columns to match chordoma_loss
  rename(biospecimen_id = Kids_First_Biospecimen_ID) %>%
  select(biospecimen_id, status)
copy_neutral_df
chordoma_copy <- chordoma_loss %>% 
  #join the losses with the neutrals to get a new data frame
  select(biospecimen_id, status) %>%
  bind_rows(copy_neutral_df)
chordoma_copy

Need to get the sample_id that corresponds to biospecimen_id into chordoma_copy so we can match WGS and RNA-seq biospecimens from the same event/sample:

chordoma_copy <- chordoma_copy %>%
  # get only the Kids_First_Biospecimen_ID, sample_id columns from our identifier data.frame
  # then use biospecimen IDs to add the sample_id info
  inner_join(select(chordoma_id_df,
                    Kids_First_Biospecimen_ID,
                    sample_id),
             by = c("biospecimen_id" = "Kids_First_Biospecimen_ID"))
chordoma_copy

look at SMARCB1 expression values only in chordoma

# get the row that contains the SMARCB1 values
# gene symbols are rownames
smarcb1_expression <- expression_data[which(rownames(expression_data) == "SMARCB1"), ]

# now only the columns correspond to chordoma samples
smarcb1_expression <- smarcb1_expression[, which(colnames(expression_data) %in% chordoma_samples) ]
smarcb1_expression

The smarcb1_expression is a not a friendly form ^^; Transposing needed:

# transpose such that samples are rows
smarcb1_expression <- t(smarcb1_expression) %>%
  # make a data.frame
  as.data.frame() %>%
  # we want the rownames that are biospecimen identifers as their own column called Kids_First_Biospecimen_ID
  tibble::rownames_to_column("Kids_First_Biospecimen_ID") %>%
  # give SMARCB1 column a slightly better column name
  rename(SMARCB1_expression = SMARCB1)
smarcb1_expression

This also needs sample_id to add it in:

smarcb1_expression <- smarcb1_expression %>%
  inner_join(select(chordoma_id_df,
                    Kids_First_Biospecimen_ID,
                    sample_id),
             by = "Kids_First_Biospecimen_ID")
smarcb1_expression
chordoma_smarcb1_df <- smarcb1_expression %>%
  # any missing samples will get filled with NA when using a full join
  full_join(chordoma_copy, by = "sample_id")
chordoma_smarcb1_df
# this step adds in the participant identifier (sample_id to match between the two data.frame)
chordoma_smarcb1_df <- chordoma_smarcb1_df %>%
  inner_join(distinct(select(chordoma_id_df, 
                             sample_id, 
                             Kids_First_Participant_ID)),
             by = "sample_id")

# combining the two biospecimen identifiers to a single column (all biospecimen IDs for a sampl separated by a comma)
chordoma_smarcb1_df <- chordoma_smarcb1_df %>%
  mutate(Kids_First_Biospecimen_ID = if_else(
    # one sample is missing WGS data, so if that's true only include biospecimen ID from RNA-seq
    is.na(biospecimen_id),
    Kids_First_Biospecimen_ID,
    paste(Kids_First_Biospecimen_ID, biospecimen_id, sep = ", ")
  ))
chordoma_smarcb1_df
chordoma_smarcb1_df <- chordoma_smarcb1_df %>%
  select(Kids_First_Participant_ID, 
         Kids_First_Biospecimen_ID, 
         sample_id,
         status,
         SMARCB1_expression) %>%
  # 'status' is replaced a more descriptive name
  rename(focal_SMARCB1_status = status)
chordoma_smarcb1_df
library(ggplot2)
# this specifies that this is the data we want to plot
chordoma_smarcb1_df %>%
  # drop the sample that doesn't have WGS data
  tidyr::drop_na() %>%
  # this step specifies what should go on the x- and y-axes
  ggplot(aes(x = focal_SMARCB1_status,
             y = SMARCB1_expression)) +
  # we want a jitter plot where the points aren't too far 
  # apart that's what width does
  geom_jitter(width = 0.1) +
  # this is plotting the median as a blue diamond
  stat_summary(fun.y = "median", 
               geom = "point", 
               size = 3, 
               color = "blue", 
               shape = 18)

Add a new chunk by clicking the Insert Chunk button on the toolbar or by pressing Cmd+Option+I.

When you save the notebook, an HTML file containing the code and output will be saved alongside it (click the Preview button or press Cmd+Shift+K to preview the HTML file).

The preview shows you a rendered HTML copy of the contents of the editor. Consequently, unlike Knit, Preview does not run any R code chunks. Instead, the output of the chunk when it was last run in the editor is displayed.

LS0tCnRpdGxlOiAiU3ViZ3R5cGluZy1jaG9yZG9tYSIKb3V0cHV0OiBodG1sX25vdGVib29rCmF1dGhvcjogTWF0ZXVzeiBLb3B0eXJhIApkYXRlOiAyMDE5MTEyMQotLS0KCmBgYHtyfQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHJlYWRyKQpgYGAKCmBgYHtyfQpoaXN0b2xvZ2llc19kZiA8LSByZWFkX3RzdigiLi4vLi4vZGF0YS9wYnRhLWhpc3RvbG9naWVzLnRzdiIpCmBgYApgYGB7cn0KY2hvcmRvbWFfc2FtcGxlcyA8LSBoaXN0b2xvZ2llc19kZiAlPiUKICBmaWx0ZXIoc2hvcnRfaGlzdG9sb2d5PT0iQ2hvcmRvbWEiKSAlPiUgCiAgcHVsbChLaWRzX0ZpcnN0X0Jpb3NwZWNpbWVuX0lEKQpgYGAKCmBgYHtyfQpmb2NhbF9jbl9kZiA8LSByZWFkX3RzdigiLi4vZm9jYWwtY24tZmlsZS1wcmVwYXJhdGlvbi9yZXN1bHRzL2NvbnRyb2xmcmVlY19hbm5vdGF0ZWRfY25fYXV0b3NvbWVzLnRzdi5neiIpCmBgYAoKYGBge3J9CmNob3Jkb21hX2xvc3MgPC0gZm9jYWxfY25fZGYgJT4lIAogIGZpbHRlcihiaW9zcGVjaW1lbl9pZCAlaW4lIGNob3Jkb21hX3NhbXBsZXMsIGdlbmVfc3ltYm9sPT0iU01BUkNCMSIpCgpjaG9yZG9tYV9sb3NzIApgYGAKCmBgYHtyfQojd2UgbmVlZCB0byBpbmNsdWRlIHRoZSBzYW1wbGVfaWQgZmllbGQgZnJvbSBwYnRhLWhpc3RvbG9naWVzLnRzdiBpbiB0aGUgZmluYWwgdGFibGUgKGZpZWxkIHdpbGwgYWxsb3cgI3VzIHRvIG1hcCBiZXR3ZWVuIFJOQS1zZXEgKGUuZy4sIFNNQVJDQjEgZXhwcmVzc2lvbiB2YWx1ZXMpIGFuZCBXR1MgZGF0YSAoZS5nLiwgU01BUkNCMSBmb2NhbCBjb3B5ICNudW1iZXIgc3RhdHVzKSBmcm9tIHRoZSBzYW1lIGV2ZW50IGZvciBhIGdpdmVuIGluZGl2aWR1YWwpLgojVG8gZ2V0IHRoZSBTTUFSQ0IxIGppdHRlciBwbG90IGluIHRoZSBwaG90byBoZXJlICMyNTAgKGNvbW1lbnQpLCB5b3Ugd2lsbCBmaXJzdCBuZWVkIHRvIHJlYWQgaW4gdGhlICNjb2xsYXBzZWQgZXhwcmVzc2lvbiBkYXRhCgpleHByZXNzaW9uX2RhdGEgPC0gcmVhZF9yZHMoZmlsZS5wYXRoKCIuLiIsICIuLiIsICJkYXRhIiwgInBidGEtZ2VuZS1leHByZXNzaW9uLXJzZW0tZnBrbS1jb2xsYXBzZWQuc3RyYW5kZWQucmRzIikpCmV4cHJlc3Npb25fZGF0YQpgYGAKCmBgYHtyfQpjaG9yZG9tYV9pZF9kZiA8LSBoaXN0b2xvZ2llc19kZiAlPiUgCiAgIyBvbmx5IHJvd3Mgd2l0aCBjaG9yZG9tYSBzYW1wbGVzCiAgZmlsdGVyKHNob3J0X2hpc3RvbG9neSA9PSAiQ2hvcmRvbWEiKSAlPiUKICAjIHNlbGVjdCBvbmx5IHRoZXNlIGNvbHVtbnMgdGhhdCB3ZSdsbCBuZWVkIGxhdGVyCiAgc2VsZWN0KEtpZHNfRmlyc3RfQmlvc3BlY2ltZW5fSUQsIHNhbXBsZV9pZCwgS2lkc19GaXJzdF9QYXJ0aWNpcGFudF9JRCwKICAgICAgICAgZXhwZXJpbWVudGFsX3N0cmF0ZWd5KQpjaG9yZG9tYV9pZF9kZgpgYGAKCmBgYHtyfQpjb3B5X25ldXRyYWxfZGYgPC0gY2hvcmRvbWFfaWRfZGYgJT4lIAogICMgdGhlIGNvcHkgZXZlbnRzIGNhbiBvbmx5IGJlIHRha2VuIGZyb20gV0dTIGRhdGEgbm90IFJOQS1zZXEgZGF0YQogICMgd2UgYWxzbyBvbmx5IHdhbnQgYmlvc3BlY2ltZW5zIHdoZXJlIGEgbG9zcyB3YXMgbm90IHJlY29yZGVkIHRvIGF2b2lkIGR1cGxpY2F0ZXMKICBmaWx0ZXIoZXhwZXJpbWVudGFsX3N0cmF0ZWd5ID09ICJXR1MiLAogICAgICAgICAhKEtpZHNfRmlyc3RfQmlvc3BlY2ltZW5fSUQgJWluJSBjaG9yZG9tYV9sb3NzJGJpb3NwZWNpbWVuX2lkKSkgJT4lCiAgIyBpZiB0aGVyZSdzIG5vIGxvc3MsIGxldCdzIGFzc3VtZSBzdGF0dXMgaXMgY29weSBuZXV0cmFsCiAgbXV0YXRlKHN0YXR1cyA9ICJuZXV0cmFsIikgJT4lCiAgIyBsZXQncyBnZXQgdGhlIGNvbHVtbnMgdG8gbWF0Y2ggY2hvcmRvbWFfbG9zcwogIHJlbmFtZShiaW9zcGVjaW1lbl9pZCA9IEtpZHNfRmlyc3RfQmlvc3BlY2ltZW5fSUQpICU+JQogIHNlbGVjdChiaW9zcGVjaW1lbl9pZCwgc3RhdHVzKQpjb3B5X25ldXRyYWxfZGYKYGBgCgpgYGB7cn0KY2hvcmRvbWFfY29weSA8LSBjaG9yZG9tYV9sb3NzICU+JSAKICAjam9pbiB0aGUgbG9zc2VzIHdpdGggdGhlIG5ldXRyYWxzIHRvIGdldCBhIG5ldyBkYXRhIGZyYW1lCiAgc2VsZWN0KGJpb3NwZWNpbWVuX2lkLCBzdGF0dXMpICU+JQogIGJpbmRfcm93cyhjb3B5X25ldXRyYWxfZGYpCmNob3Jkb21hX2NvcHkKYGBgCk5lZWQgdG8gZ2V0IHRoZSBzYW1wbGVfaWQgdGhhdCBjb3JyZXNwb25kcyB0byBiaW9zcGVjaW1lbl9pZCBpbnRvIGNob3Jkb21hX2NvcHkgc28gd2UgY2FuIG1hdGNoIFdHUyBhbmQgUk5BLXNlcSBiaW9zcGVjaW1lbnMgZnJvbSB0aGUgc2FtZSBldmVudC9zYW1wbGU6CmBgYHtyfQpjaG9yZG9tYV9jb3B5IDwtIGNob3Jkb21hX2NvcHkgJT4lCiAgIyBnZXQgb25seSB0aGUgS2lkc19GaXJzdF9CaW9zcGVjaW1lbl9JRCwgc2FtcGxlX2lkIGNvbHVtbnMgZnJvbSBvdXIgaWRlbnRpZmllciBkYXRhLmZyYW1lCiAgIyB0aGVuIHVzZSBiaW9zcGVjaW1lbiBJRHMgdG8gYWRkIHRoZSBzYW1wbGVfaWQgaW5mbwogIGlubmVyX2pvaW4oc2VsZWN0KGNob3Jkb21hX2lkX2RmLAogICAgICAgICAgICAgICAgICAgIEtpZHNfRmlyc3RfQmlvc3BlY2ltZW5fSUQsCiAgICAgICAgICAgICAgICAgICAgc2FtcGxlX2lkKSwKICAgICAgICAgICAgIGJ5ID0gYygiYmlvc3BlY2ltZW5faWQiID0gIktpZHNfRmlyc3RfQmlvc3BlY2ltZW5fSUQiKSkKY2hvcmRvbWFfY29weQpgYGAKbG9vayBhdCBTTUFSQ0IxIGV4cHJlc3Npb24gdmFsdWVzIG9ubHkgaW4gY2hvcmRvbWEKCmBgYHtyfQojIGdldCB0aGUgcm93IHRoYXQgY29udGFpbnMgdGhlIFNNQVJDQjEgdmFsdWVzCiMgZ2VuZSBzeW1ib2xzIGFyZSByb3duYW1lcwpzbWFyY2IxX2V4cHJlc3Npb24gPC0gZXhwcmVzc2lvbl9kYXRhW3doaWNoKHJvd25hbWVzKGV4cHJlc3Npb25fZGF0YSkgPT0gIlNNQVJDQjEiKSwgXQoKIyBub3cgb25seSB0aGUgY29sdW1ucyBjb3JyZXNwb25kIHRvIGNob3Jkb21hIHNhbXBsZXMKc21hcmNiMV9leHByZXNzaW9uIDwtIHNtYXJjYjFfZXhwcmVzc2lvblssIHdoaWNoKGNvbG5hbWVzKGV4cHJlc3Npb25fZGF0YSkgJWluJSBjaG9yZG9tYV9zYW1wbGVzKSBdCnNtYXJjYjFfZXhwcmVzc2lvbgpgYGAKClRoZSBzbWFyY2IxX2V4cHJlc3Npb24gaXMgYSBub3QgYSBmcmllbmRseSBmb3JtIF5eOyBUcmFuc3Bvc2luZyBuZWVkZWQ6IApgYGB7cn0KIyB0cmFuc3Bvc2Ugc3VjaCB0aGF0IHNhbXBsZXMgYXJlIHJvd3MKc21hcmNiMV9leHByZXNzaW9uIDwtIHQoc21hcmNiMV9leHByZXNzaW9uKSAlPiUKICAjIG1ha2UgYSBkYXRhLmZyYW1lCiAgYXMuZGF0YS5mcmFtZSgpICU+JQogICMgd2Ugd2FudCB0aGUgcm93bmFtZXMgdGhhdCBhcmUgYmlvc3BlY2ltZW4gaWRlbnRpZmVycyBhcyB0aGVpciBvd24gY29sdW1uIGNhbGxlZCBLaWRzX0ZpcnN0X0Jpb3NwZWNpbWVuX0lECiAgdGliYmxlOjpyb3duYW1lc190b19jb2x1bW4oIktpZHNfRmlyc3RfQmlvc3BlY2ltZW5fSUQiKSAlPiUKICAjIGdpdmUgU01BUkNCMSBjb2x1bW4gYSBzbGlnaHRseSBiZXR0ZXIgY29sdW1uIG5hbWUKICByZW5hbWUoU01BUkNCMV9leHByZXNzaW9uID0gU01BUkNCMSkKc21hcmNiMV9leHByZXNzaW9uCmBgYApUaGlzIGFsc28gbmVlZHMgc2FtcGxlX2lkIHRvIGFkZCBpdCBpbjoKYGBge3J9CnNtYXJjYjFfZXhwcmVzc2lvbiA8LSBzbWFyY2IxX2V4cHJlc3Npb24gJT4lCiAgaW5uZXJfam9pbihzZWxlY3QoY2hvcmRvbWFfaWRfZGYsCiAgICAgICAgICAgICAgICAgICAgS2lkc19GaXJzdF9CaW9zcGVjaW1lbl9JRCwKICAgICAgICAgICAgICAgICAgICBzYW1wbGVfaWQpLAogICAgICAgICAgICAgYnkgPSAiS2lkc19GaXJzdF9CaW9zcGVjaW1lbl9JRCIpCnNtYXJjYjFfZXhwcmVzc2lvbgpgYGAKYGBge3J9CmNob3Jkb21hX3NtYXJjYjFfZGYgPC0gc21hcmNiMV9leHByZXNzaW9uICU+JQogICMgYW55IG1pc3Npbmcgc2FtcGxlcyB3aWxsIGdldCBmaWxsZWQgd2l0aCBOQSB3aGVuIHVzaW5nIGEgZnVsbCBqb2luCiAgZnVsbF9qb2luKGNob3Jkb21hX2NvcHksIGJ5ID0gInNhbXBsZV9pZCIpCmNob3Jkb21hX3NtYXJjYjFfZGYKYGBgCgpgYGB7cn0KIyB0aGlzIHN0ZXAgYWRkcyBpbiB0aGUgcGFydGljaXBhbnQgaWRlbnRpZmllciAoc2FtcGxlX2lkIHRvIG1hdGNoIGJldHdlZW4gdGhlIHR3byBkYXRhLmZyYW1lKQpjaG9yZG9tYV9zbWFyY2IxX2RmIDwtIGNob3Jkb21hX3NtYXJjYjFfZGYgJT4lCiAgaW5uZXJfam9pbihkaXN0aW5jdChzZWxlY3QoY2hvcmRvbWFfaWRfZGYsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZV9pZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2lkc19GaXJzdF9QYXJ0aWNpcGFudF9JRCkpLAogICAgICAgICAgICAgYnkgPSAic2FtcGxlX2lkIikKCiMgY29tYmluaW5nIHRoZSB0d28gYmlvc3BlY2ltZW4gaWRlbnRpZmllcnMgdG8gYSBzaW5nbGUgY29sdW1uIChhbGwgYmlvc3BlY2ltZW4gSURzIGZvciBhIHNhbXBsIHNlcGFyYXRlZCBieSBhIGNvbW1hKQpjaG9yZG9tYV9zbWFyY2IxX2RmIDwtIGNob3Jkb21hX3NtYXJjYjFfZGYgJT4lCiAgbXV0YXRlKEtpZHNfRmlyc3RfQmlvc3BlY2ltZW5fSUQgPSBpZl9lbHNlKAogICAgIyBvbmUgc2FtcGxlIGlzIG1pc3NpbmcgV0dTIGRhdGEsIHNvIGlmIHRoYXQncyB0cnVlIG9ubHkgaW5jbHVkZSBiaW9zcGVjaW1lbiBJRCBmcm9tIFJOQS1zZXEKICAgIGlzLm5hKGJpb3NwZWNpbWVuX2lkKSwKICAgIEtpZHNfRmlyc3RfQmlvc3BlY2ltZW5fSUQsCiAgICBwYXN0ZShLaWRzX0ZpcnN0X0Jpb3NwZWNpbWVuX0lELCBiaW9zcGVjaW1lbl9pZCwgc2VwID0gIiwgIikKICApKQpjaG9yZG9tYV9zbWFyY2IxX2RmCmBgYAoKYGBge3J9CmNob3Jkb21hX3NtYXJjYjFfZGYgPC0gY2hvcmRvbWFfc21hcmNiMV9kZiAlPiUKICBzZWxlY3QoS2lkc19GaXJzdF9QYXJ0aWNpcGFudF9JRCwgCiAgICAgICAgIEtpZHNfRmlyc3RfQmlvc3BlY2ltZW5fSUQsIAogICAgICAgICBzYW1wbGVfaWQsCiAgICAgICAgIHN0YXR1cywKICAgICAgICAgU01BUkNCMV9leHByZXNzaW9uKSAlPiUKICAjICdzdGF0dXMnIGlzIHJlcGxhY2VkIGEgbW9yZSBkZXNjcmlwdGl2ZSBuYW1lCiAgcmVuYW1lKGZvY2FsX1NNQVJDQjFfc3RhdHVzID0gc3RhdHVzKQpjaG9yZG9tYV9zbWFyY2IxX2RmCmBgYAoKYGBge3J9CmxpYnJhcnkoZ2dwbG90MikKYGBgCgpgYGB7cn0KIyB0aGlzIHNwZWNpZmllcyB0aGF0IHRoaXMgaXMgdGhlIGRhdGEgd2Ugd2FudCB0byBwbG90CmNob3Jkb21hX3NtYXJjYjFfZGYgJT4lCiAgIyBkcm9wIHRoZSBzYW1wbGUgdGhhdCBkb2Vzbid0IGhhdmUgV0dTIGRhdGEKICB0aWR5cjo6ZHJvcF9uYSgpICU+JQogICMgdGhpcyBzdGVwIHNwZWNpZmllcyB3aGF0IHNob3VsZCBnbyBvbiB0aGUgeC0gYW5kIHktYXhlcwogIGdncGxvdChhZXMoeCA9IGZvY2FsX1NNQVJDQjFfc3RhdHVzLAogICAgICAgICAgICAgeSA9IFNNQVJDQjFfZXhwcmVzc2lvbikpICsKICAjIHdlIHdhbnQgYSBqaXR0ZXIgcGxvdCB3aGVyZSB0aGUgcG9pbnRzIGFyZW4ndCB0b28gZmFyIAogICMgYXBhcnQgdGhhdCdzIHdoYXQgd2lkdGggZG9lcwogIGdlb21faml0dGVyKHdpZHRoID0gMC4xKSArCiAgIyB0aGlzIGlzIHBsb3R0aW5nIHRoZSBtZWRpYW4gYXMgYSBibHVlIGRpYW1vbmQKICBzdGF0X3N1bW1hcnkoZnVuLnkgPSAibWVkaWFuIiwgCiAgICAgICAgICAgICAgIGdlb20gPSAicG9pbnQiLCAKICAgICAgICAgICAgICAgc2l6ZSA9IDMsIAogICAgICAgICAgICAgICBjb2xvciA9ICJibHVlIiwgCiAgICAgICAgICAgICAgIHNoYXBlID0gMTgpCmBgYAoKQWRkIGEgbmV3IGNodW5rIGJ5IGNsaWNraW5nIHRoZSAqSW5zZXJ0IENodW5rKiBidXR0b24gb24gdGhlIHRvb2xiYXIgb3IgYnkgcHJlc3NpbmcgKkNtZCtPcHRpb24rSSouCgpXaGVuIHlvdSBzYXZlIHRoZSBub3RlYm9vaywgYW4gSFRNTCBmaWxlIGNvbnRhaW5pbmcgdGhlIGNvZGUgYW5kIG91dHB1dCB3aWxsIGJlIHNhdmVkIGFsb25nc2lkZSBpdCAoY2xpY2sgdGhlICpQcmV2aWV3KiBidXR0b24gb3IgcHJlc3MgKkNtZCtTaGlmdCtLKiB0byBwcmV2aWV3IHRoZSBIVE1MIGZpbGUpLiAKClRoZSBwcmV2aWV3IHNob3dzIHlvdSBhIHJlbmRlcmVkIEhUTUwgY29weSBvZiB0aGUgY29udGVudHMgb2YgdGhlIGVkaXRvci4gQ29uc2VxdWVudGx5LCB1bmxpa2UgKktuaXQqLCAqUHJldmlldyogZG9lcyBub3QgcnVuIGFueSBSIGNvZGUgY2h1bmtzLiBJbnN0ZWFkLCB0aGUgb3V0cHV0IG9mIHRoZSBjaHVuayB3aGVuIGl0IHdhcyBsYXN0IHJ1biBpbiB0aGUgZWRpdG9yIGlzIGRpc3BsYXllZC4KCg==